package com.sky.skyopsserver.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.sky.skyopsserver.domain.Credential;
import com.sky.skyopsserver.vos.*;

import java.util.List;

/**
 * 凭据信息服务接口
 * 
 * @author Administrator
 * @description 针对表【credential(凭据信息表)】的数据库操作Service
 * @createDate 2025-09-13 17:43:04
 */
public interface CredentialService extends IService<Credential> {

    /**
     * 添加凭据
     * 
     * @param reqVO 添加凭据请求VO
     * @return 凭据ID
     */
    Long addCredential(CredentialAddReqVO reqVO);

    /**
     * 更新凭据信息
     * 
     * @param reqVO 更新凭据请求VO
     * @return 是否更新成功
     */
    Boolean updateCredential(CredentialUpdateReqVO reqVO);

    /**
     * 根据ID删除凭据
     * 
     * @param id 凭据ID
     * @return 是否删除成功
     */
    Boolean deleteCredential(Long id);

    /**
     * 批量删除凭据
     * 
     * @param ids 凭据ID列表
     * @return 是否删除成功
     */
    Boolean batchDeleteCredential(List<Long> ids);

    /**
     * 根据ID查询凭据详情
     * 
     * @param id 凭据ID
     * @return 凭据详情
     */
    CredentialRspVO getCredentialById(Long id);

    /**
     * 分页查询凭据列表
     * 
     * @param reqVO 分页查询请求VO
     * @return 分页结果
     */
    IPage<CredentialRspVO> getCredentialPage(CredentialPageReqVO reqVO);

    /**
     * 查询所有凭据选项（用于下拉选择）
     * 
     * @return 凭据选项列表
     */
    List<CredentialOptionRspVO> getAllCredentialOptions();

    /**
     * 根据认证方式查询凭据选项
     * 
     * @param type 认证方式
     * @return 凭据选项列表
     */
    List<CredentialOptionRspVO> getCredentialOptionsByType(Integer type);

    /**
     * 查询有主机使用的凭据选项
     * 
     * @return 凭据选项列表
     */
    List<CredentialOptionRspVO> getCredentialOptionsWithHosts();

    /**
     * 查询未使用的凭据选项
     * 
     * @return 凭据选项列表
     */
    List<CredentialOptionRspVO> getUnusedCredentialOptions();

    /**
     * 获取凭据统计信息
     * 
     * @return 凭据统计信息
     */
    CredentialStatisticsRspVO getCredentialStatistics();

    /**
     * 检查凭据名称是否已存在
     * 
     * @param name 凭据名称
     * @param excludeId 排除的凭据ID（用于更新时检查）
     * @return 是否存在
     */
    Boolean checkCredentialNameExists(String name, Long excludeId);

    /**
     * 根据名称模糊查询凭据
     * 
     * @param name 凭据名称关键字
     * @return 凭据列表
     */
    List<CredentialRspVO> searchCredentialByName(String name);

    /**
     * 根据用户名模糊查询凭据
     * 
     * @param account 用户名关键字
     * @return 凭据列表
     */
    List<CredentialRspVO> searchCredentialByAccount(String account);

    /**
     * 获取凭据下的主机数量
     * 
     * @param credentialId 凭据ID
     * @return 主机数量
     */
    Long getHostCountByCredentialId(Long credentialId);

    /**
     * 批量获取凭据下的主机数量
     * 
     * @param credentialIds 凭据ID列表
     * @return 凭据ID与主机数量的映射
     */
    java.util.Map<Long, Long> getHostCountByCredentialIds(List<Long> credentialIds);

    /**
     * 验证凭据类型是否有效
     * 
     * @param type 凭据类型
     * @return 是否有效
     */
    Boolean validateCredentialType(Integer type);

    /**
     * 验证凭据信息完整性
     * 
     * @param type 认证方式
     * @param password 密码
     * @param secretKey 密钥
     * @return 是否有效
     */
    Boolean validateCredentialInfo(Integer type, String password, String secretKey);

    /**
     * 加密凭据敏感信息
     * 
     * @param credential 凭据实体
     * @return 加密后的凭据
     */
    Credential encryptCredential(Credential credential);

    /**
     * 解密凭据敏感信息
     * 
     * @param credential 凭据实体
     * @return 解密后的凭据
     */
    Credential decryptCredential(Credential credential);

    /**
     * 脱敏显示密码
     * 
     * @param password 原始密码
     * @return 脱敏后的密码
     */
    String maskPassword(String password);

    /**
     * 脱敏显示密钥
     * 
     * @param secretKey 原始密钥
     * @return 脱敏后的密钥
     */
    String maskSecretKey(String secretKey);

    /**
     * 测试凭据连接
     * 
     * @param credentialId 凭据ID
     * @param host 主机地址
     * @param port 端口
     * @return 连接测试结果
     */
    Boolean testCredentialConnection(Long credentialId, String host, Integer port);

    /**
     * 获取所有认证方式列表
     * 
     * @return 认证方式列表
     */
    List<java.util.Map<String, Object>> getAllCredentialTypes();
}
